<?php

require_once dirname(__FILE__) . '/../lib/pedidosGeneratorConfiguration.class.php';
require_once dirname(__FILE__) . '/../lib/pedidosGeneratorHelper.class.php';

/**
 * pedidos actions.
 *
 * @package    tercermilenio
 * @subpackage pedidos
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 12474 2008-10-31 10:41:27Z fabien $
 */
class pedidosActions extends autoPedidosActions {

    public function executeIndex(sfWebRequest $request) {

        //existen pedidos vencidos
        $this->pedidosVencidos = PedidosPeer::existenPedidosVencidos();

        // sorting
        if ($request->getParameter('sort') && $this->isValidSortColumn($request->getParameter('sort'))) {
            $this->setSort(array($request->getParameter('sort'), $request->getParameter('sort_type')));
        }

        // pager
        if ($request->getParameter('page')) {
            $this->setPage($request->getParameter('page'));
        }


        sfContext::getInstance()->getUser()->setAttribute('pedido', null);

        $this->pager = $this->getPager();
        $this->sort = $this->getSort();
    }

    /**
     * Ejecuta la acción Nuevo del modulo Pedidos
     * @author Maximiliano Vicente
     * @param sfWebRequest $request
     */
    public function executeNew(sfWebRequest $request) {


            //if ($this->getUser()->hasCredential('tm_be_pedidos_new')) {
            sfContext::getInstance()->getUser()->setAttribute('pedido', null);
            $this->title = 'Nuevo Pedido';
            $this->form = $this->configuration->getForm();
            $this->pedidos = $this->form->getObject();


            $paramFormPedido = $request->getParameter('pedidos');
            if (!empty($paramFormPedido)) {
                if ($request->isMethod('post')) {

                    $this->form->bind($request->getParameter('pedidos'));

                    if ($this->form->isValid()) {
//$this->pedido = sfContext::getInstance()->getUser()->getAttribute('pedido');
                        $carro = $this->getUser()->getAttribute('pedido');
                        if (!empty($carro)) {
                            $formValues = $this->form->getValues();

                            $clienteId = $formValues['ped_cliente'];
                            $fechaLimite = $formValues['ped_fecha_limite'];

                            $cliente = ClientesPeer::retrieveByPK($clienteId);

                            if (!empty($cliente)) {
                                $cm = PedidosManager::getInstance();
                                $cm->checkOut($this->form);
                                $this->getUser()->setFlash('notice', 'El pedido se ha registrado exitosamente.');
                                $this->redirect('@pedidos');
                            } else {
                                $this->getUser()->setFlash('error', 'El cliente no existe.');
                            }
                        } else {
                            $this->getUser()->setFlash('error', 'No hay productos agregados al pedido.');
                        }
                    }
                } else {
                    sfContext::getInstance()->getUser()->setAttribute('pedido', null);
                }
            }

    }

    /**
     *
     * @param sfWebRequest $request
     */
    public function executeEdit(sfWebRequest $request) {

        //Objeto y form Compra
        $this->pedidos = $this->getRoute()->getObject();
        $this->form = $this->configuration->getForm($this->pedidos);

        $this->pedId = $this->pedidos->getPedId();

        if (!$request->isMethod('POST')) {
            sfContext::getInstance()->getUser()->setAttribute('pedido', null);
        }
        //Cargar el detalle en sesión
        $c = new Criteria();
        $c->add(DetallePedidosPeer::DET_PED_PEDIDO, $this->pedId);
        $detallePedido = DetallePedidosPeer::doSelect($c);

        foreach ($detallePedido as $fila) {
            $producto = array();
            $producto["pro_ped_talle"] = $fila->getDetPedTalle();
            $producto["pro_ped_cantidad"] = $fila->getDetPedCantidad();
            $producto["pro_ped_descripcion"] = $fila->getDetPedDescripcion();

            $pm = PedidosManager::getInstance();
            $pm->agregarProducto($producto);
        }
    }

    protected function processForm(sfWebRequest $request, sfForm $form) {
        $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
        if ($form->isValid()) {
            $notice = $form->getObject()->isNew() ? 'The item was created successfully.' : 'The item was updated successfully.';

            //if(!empty($pedidos)){

            $carro = $this->getUser()->getAttribute('pedido');
            if (!empty($carro)) {
                $formValues = $form->getValues();

                $idPedido = $formValues['ped_id'];
                $idCliente = $formValues['ped_cliente'];
                //$fechaLimite = $formValues['ped_fecha_limite'];

                $cliente = ClientesPeer::retrieveByPK($idCliente);

                if (!empty($cliente)) {
                    $pm = PedidosManager::getInstance();
                    //$pedidos = $form->save();
                    
                    $pedidos = $pm->checkOut($form, $idPedido);

//var_dump($pedidos);exit();
                    $this->getUser()->setFlash('notice', 'El pedido se ha registrado exitosamente.');

                     $this->dispatcher->notify(new sfEvent($this, 'admin.save_object', array('object' => $pedidos)));
                    //$this->redirect('@compras');
                } else {
                    $this->getUser()->setFlash('error', 'El cliente no existe.');
                }
            } else {
                $this->getUser()->setFlash('error', 'No hay productos agregados al pedido.');
            }

            //}

            /* if ($request->hasParameter('_save_and_add')) {
              $this->getUser()->setFlash('notice', $notice . ' You can add another one below.');

              $this->redirect('@pedidos_new');
              } else { */
            //$this->getUser()->setFlash('notice', $notice);

            $this->redirect('@pedidos');
            /* } */
        } else {
            $this->getUser()->setFlash('error', 'The item has not been saved due to some errors.', false);
        }
    }

    public function executeDelete(sfWebRequest $request) {
        $request->checkCSRFProtection();

        $this->dispatcher->notify(new sfEvent($this, 'admin.delete_object', array('object' => $this->getRoute()->getObject())));


        $con = Propel::getConnection();

        try {
            //abrimos la transacción
            $con->beginTransaction();

            //operaciones pertinentes contra la base de datos
            //Borrar detalle del pedido
            $borrado = DetallePedidosPeer::BorrarDetalleDePedido($this->getRoute()->getObject()->getPedId());
            $this->getRoute()->getObject()->delete();

            $this->getUser()->setFlash('notice', 'The item was deleted successfully.');
            //si todo va bien guardamos los cambios
            $con->commit();
        } catch (Exception $e) {

            // Hacemos rollback de los cambios en caso de fallo
            $con->rollback();
            $this->getUser()->setFlash('error', 'The item has not been saved due to some errors.');
            //devolvemos el error al depurador
            //throw $e;
        }

        $this->redirect('@pedidos');
    }

    protected function executeBatchDelete(sfWebRequest $request) {
        $ids = $request->getParameter('ids');
        $count = 0;

        try {
            //abrimos la transacción
            $con->beginTransaction();

            foreach (PedidosPeer::retrieveByPks($ids) as $object) {
                $this->dispatcher->notify(new sfEvent($this, 'admin.delete_object', array('object' => $object)));

                $borrado = DetallePedidosPeer::BorrarDetalleDePedido($object->getPedId());

                $object->delete();
                if ($object->isDeleted()) {
                    $count++;
                }
            }
            //si todo va bien guardamos los cambios
            $con->commit();
        } catch (Exception $e) {

            // Hacemos rollback de los cambios en caso de fallo
            $con->rollback();
            $this->getUser()->setFlash('error', 'The item has not been saved due to some errors.');
            //devolvemos el error al depurador
            //throw $e;
        }

        if ($count >= count($ids)) {
            $this->getUser()->setFlash('notice', 'The selected items have been deleted successfully.');
        } else {
            $this->getUser()->setFlash('error', 'A problem occurs when deleting the selected items.');
        }

        $this->redirect('@pedidos');
    }

    public function executeFilter(sfWebRequest $request) {
        $this->setPage(1);

        if ($request->hasParameter('_reset')) {
            $this->setFilters($this->configuration->getFilterDefaults());

            $this->redirect('@pedidos');
        }

        $this->filters = $this->configuration->getFilterForm($this->getFilters());

        $this->filters->bind($request->getParameter($this->filters->getName()));

        $fieldName = 'ped_fecha_limite';

        if ($this->filters->isValid()) {
            $this->setFilters($this->filters->getValues());

            $this->redirect('@pedidos');
        }

        $this->pager = $this->getPager();
        $this->sort = $this->getSort();

        $this->setTemplate('index');
    }

    /**
     *
     * @param sfWebRequest $request
     */
    public function executeDetallePedido(sfWebRequest $request) {

        if ($request->hasParameter('ped_id')) {
            $this->pedId = $request->getParameter('ped_id');
        }

        if ($request->hasParameter('act')) {

            $articulo = $request->getParameter('pro_art');
            $talle = $request->getParameter('pro_tal');
            $action = $request->getParameter('act');

            $producto = ProductosPeer::retrieveByPK($articulo, $talle);

            //if (!empty($producto)) {
            switch ($action) {
                case 'new':
                    $producto = $request->getParameter('agregar_productos_pedidos');
                    $pm = PedidosManager::getInstance();
                    $pm->agregarProducto($producto);
                    break;
                case 'add':

                    if ($request->hasParameter('pro_art')) {
                        $pm = PedidosManager::getInstance();
                        $pm->agregarProducto(null, $request->getParameter('pro_art'));
                    }
                    break;
                case 'del':
                    $pm = new PedidosManager();
                    $pm->eliminarCantProducto($request->getParameter('pro_art'));
                    break;
                case 'quit':
                    $pm = new PedidosManager();
                    $pm->eliminarProducto($producto);
                    break;
            };
            //} else {
            //    sfContext::getInstance()->getUser()->setFlash('notice', 'El producto no existe.');
            //}
        }

        $pedido = sfContext::getInstance()->getUser()->getAttribute('pedido');
        if (!empty($pedido)) {
            $this->carro = $pedido;
        }
    }

    /**
     *
     * @param sfWebRequest $request
     */
    public function executeAgregarProductos(sfWebRequest $request) {
        //$this->compras = $this->getRoute()->getObject();

        $params = $request->getParameterHolder()->getAll();
        //form Busqueda de productos

        $formAgregar = new AgregarProductosPedidosForm();
        $paramFormAgregar = $request->getParameter('agregar_productos_pedidos');
        if (!empty($paramFormAgregar)) {
            if ($request->isMethod('post')) {

                $formAgregar->bind($paramFormAgregar);

                if ($formAgregar->isValid()) {

                    $producto = $formAgregar->getValues();

                    $pm = PedidosManager::getInstance();
                    $pm->agregarProducto($producto);
                }
            }
        }
        $pedido = sfContext::getInstance()->getUser()->getAttribute('pedido');
        if (!empty($pedido)) {
            $this->carro = $pedido;
        }
        $this->formAgregar = $formAgregar;
    }

    /**
     *
     * @param sfWebRequest $request
     */
    public function executeEliminarProducto(sfWebRequest $request) {
        $articulo = $request->getParameter('pro_art');
        $talle = $request->getParameter('pro_tal');

        $this->compras = $this->getRoute()->getObject();
        $cprId = $request->getParameter('cpr_id');

        $producto = ProductosPeer::retrieveByPK($articulo, $talle);

        if (!empty($producto)) {

            $cm = new ComprasManager();
            $cm->eliminarProducto($producto);
        } else {
            sfContext::getInstance()->getUser()->setFlash('notice', 'El producto no existe.');
        }

        //$this->redirect('compras/detalleCompra?cpr_id='.$cprId);
    }

    /**
     *
     * @param sfWebRequest $request
     */
    public function executeEliminarCantProducto(sfWebRequest $request) {
        $articulo = $request->getParameter('pro_art');
        $talle = $request->getParameter('pro_tal');

        $cprId = $request->getParameter('cpr_id');


        $producto = ProductosPeer::retrieveByPK($articulo, $talle);

        if (!empty($producto)) {
            $cm = new ComprasManager();
            $cm->eliminarCantProducto($producto);
        } else {
            sfContext::getInstance()->getUser()->setFlash('notice', 'El producto no existe.');
        }
        $this->redirect('compras/detalleCompra?cpr_id=' . $cprId);
    }

    /**
     * Vaciar pedido
     * @param sfWebRequest $request
     */
    public function executeVaciarCarro(sfWebRequest $request) {

        $pm = PedidosManager::getInstance();

        if ($pm->estaVacio()) {
            sfContext::getInstance()->getUser()->setFlash('notice', 'El pedido ya está vacío.');
        } else {
            $pm->vaciarCarro();
            if ($pm->estaVacio()) {
                sfContext::getInstance()->getUser()->setFlash('notice', 'Los productos han sido eliminados del pedido exitosamente.');
            } else {
                sfContext::getInstance()->getUser()->setFlash('notice', 'Los productos no han podido ser eliminados.');
            }
        }
        $this->redirect('pedidos/new');
    }

}
